﻿// See https://aka.ms/new-console-template for more information

using System;//展开命名空间

class Hf
{
    enum role
    {
        huang,
        zhang,
        huawei
    }

    //委托的声明：关键字delegate + 返回类型 + 名字 + 参数列表 + 英文分号
    delegate int dg(int a, int b);

    static void Main(string[] arg)
    {
        //一、
        int a1 = 1, b1 = 2;
        Console.WriteLine("abc" + a1 + b1);//结果是abc12，因为是字符串abc先与变量a连接，再与变量b连接
        Console.WriteLine("abc" + (a1 + b1));//结果是abc3,因为有括号，先算括号

        //二、在前面加个@符号，转义字符\就会失去转义效果，并且此时字符串可以占用多行
        string a2 = @"\t\a";
        Console.WriteLine(@"\t\a\\");
        Console.WriteLine(@"\t\aaaaaaa
                                        a\\");
        //此时字符串中需要两个"符号代表一个"符号
        Console.WriteLine(@"\t\aaaaaaa  ""
                                        a\\");

        //三、C#不能用小类型给大类型赋值，这时可以强制转换
        int a3 = 97;
        char b3 = (char)a3;
        Console.WriteLine(b3);

        //四、给字符串赋值时，用"+"进行字符串连接
        string a4 = "123" + "123";
        string b4 = a4 + "123";
        string c4 = a4 + b4;
        //在C++中"123"是const char*类型，所以不能进行a2的计算,但可以进行a3和a4的计算（string+const char*）（string+string）

        //五、从控制台中获取一排数据
        string a5 = Console.ReadLine();//返回值为字符串

        //六、将数字字符串转化整数(32位)
        string str1 = "123";
        int tmp = Convert.ToInt32(str1);

        //六、字符串格式化输出
        int a6 = 0, b6 = 1;
        Console.WriteLine("{0}+{1}={2}", a6, b6, a6 + b6);//有一个对应的号位(从0号位开始)，取相应的值

        //七、C#支持的所有逻辑运算符
        //逻辑与&&   逻辑或||   逻辑非！

        //八、随机数的生成
        Random rd = new Random();//随机数种子
        //伪随机
        rd.Next(1, 10);//用一系列算法生成1,9的随机数（左闭右开），因为是用算法生成的，所以叫伪随机

        //九、其他类型转为字符串
        string str11 = 123 + "";//数字+任意字符串得到一个字符串
        string str12 = Convert.ToString(123);//使用函数

        //十、
        //去除前后的空格方法Trim()
        //只去除前面的空格TrimStart()
        //只去除后面的空格TrimEnd()

        //十一、字符串分割Split()
        string str14 = "zhang,huang,chen";
        string[] strArray = str14.Split(',');
        foreach (string str in strArray)
        {
            Console.WriteLine(str);
        }

        //十二、参数数组：(注意如果有多个参数时，参数数组必须放在最后一个位置)
        //普通数组作为参数时，我们传参需要传一个数组
        static void test1(int[] arr)
        {

        }
        int[] arr = { 1, 2, 3, 4 };
        test1(arr);
        //但参数数组可以传一串数字，然后编译器自动为我们创建一个数组
        static void test2(params int[] arr)//在参数前面加一个params，就成为参数数组
        {

        }
        test2(1, 2, 3, 4);//可以传任意一组数字

        //枚举的声明定义与使用
        role rl = role.huang;

        //委托（delegate）：用于指向与委托自己的返回值和参数列表相同的函数引用，此时就可以将委托变量当做一个函数来使用
        
        static int test6(int a1,int a2)
        {
            return a1 * a2;
        }
        //委托的声明：关键字delegate + 返回类型 + 名字 + 参数列表 + 英文分号
        //委托的使用
        dg myDg = test6;
        Console.WriteLine(myDg(1, 2));
    }
}
